#include <stdio.h>
#include <string>
#include <string.h>
using namespace std;

class CTestData
{
public:
    CTestData(const char* szname=NULL)
    {
        if(NULL == szname)
        {
            name = "admin";
        }
        else
        {
            name = szname;
        }
        printf("create instance %s\n", name.c_str());
    }

    CTestData(const CTestData& o):name(o.name)
    {
        name.insert(name.begin(), 'c');
        printf("copy instance %s\n", name.c_str());
    }

    CTestData(CTestData&& o):name(o.name)
    {
        name.insert(name.begin(), 'm');
        printf("move instance %s\n", name.c_str());
    }

    ~CTestData()
    {
        printf("destory instance %s\n", name.c_str());
        name.clear();
    }
private:
    string name;
};

/*
向量vector 成员函数与特性演示

*/
#include <vector>
void Display(const vector<char> &v)
{
    printf("vector :");
    for (const char i : v)
    {
        printf("%c", i);
    }
    printf("\n");
}
void vectordemo()
{
    char vowel[] = "aeiou";
    int vowelsize = strlen(vowel);
    vector<char> v(vowel, vowel+vowelsize);//构造向量
    printf("vector size :%ld\t capacity :%ld\n", v.size(), v.capacity());
    printf("v back :%c\n", v.back());//取尾部元素不弹出
    printf("v back :%c\n", v.back());
    v.push_back('w');//于尾部添加元素，向量的最大容量可能改变
    printf("vector size :%ld\t capacity :%ld\n", v.size(), v.capacity());//容器满时再添加元素，容器会自动扩大至两倍
    v.back() = 'y';//改变尾部元素
    printf("v back :%c\n", v.back());
    vector<char> vv = v;
    
    while (!v.empty())
    // for (size_t i = 0; i < 10; i++)// 即使向量为空，以下两个操作仍正常执行，但后续再操作向量会造成内存访问错误
    {
        v.pop_back();//从尾部直接删除元素，没有返回，向量的最大容量不变
        printf("pop back\tback :%c\tvector size :%ld\t capacity :%ld\n", v.back(), v.size(), v.capacity());
    }
    Display(vv);

}






















int main()
{
    // vectordemo();
    listdemo();
    return 0;
}